package com.atguigu.bigdata.scala.chapter11;

import java.util.ArrayList;
import java.util.List;

public class Scala01_Generic_Java {
    public static void main(String[] args) {
        // TODO 泛型

        // TODO 1. 泛型和类型的区别？
        // 类型用于声明外层对象的类型，泛型主要用于声明内部数据的类型
        // 一般声明的泛型用于从外部对象限制内部数据的类型
        // 所以有时也将泛型称之 “类型参数”
        // 类声明了泛型，仅仅表明可以设定约束，但是不一定必须有约束
        // 如果没有使用泛型，那么泛型的类型自动设定为Object
        //List<User> user = null;
        Test<User> t = new Test<User>();
        User user = t.data;
        System.out.println(user);
//
        Test t1 = new Test();
        Object obj = t1.data;

        // TODO 2. 泛型的作用时机
//         泛型的作用是在声明之后起作用
//         泛型是对内部数据的类型起到约束的作用，而不是方法的约束
//         泛型只在编译时起作用，在运行时不起作用，字节码中没有泛型。称之为 泛型擦除
//         这种操作类似于super关键字
        //List<User> userList = new ArrayList<User>();

//        List list = new ArrayList();
//        list.add(new Emp());
//
//        List<User> userList = list;
//        //System.out.println(userList);
//        for ( User user : userList ) {
//            System.out.println(user);
//        }
    }

}
class Test<T> {
    public T data;
}
class User {

}
class Emp {

}
